Android – Intent 过滤器

前言

我们知道,Intent有两种启动方式,显式和隐式启动。显式启动去下:

1
startActivity(new Intent(MainActivity.this,SecondActivity.class));

显式启动没什么好说的,今天主要是说说隐式启动。一个简单的例子如下:

1
2
3
Uri uri = Uri.parse("http://www.omooo.top");
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

以上示例并没有明确指定要启动的组件,而是由系统决定。系统需要通过某种匹配规则来寻找需要启动的目标组件,这种匹配规则就依赖于Intent的过滤器实现。Intent过滤器是根据Intent中的动作(action)、类别(category)、数据(data)内容,对目标组件进行匹配和筛选的机制。当Intent匹配到一个过滤器上,系统就会启动相应的组件并传递给相应的Intent对象;如果匹配出了多个过滤器,系统会弹出对话框,由用户进行选择。下面就开始深入了解过滤规则。

由上面可知,我们知道Intent过滤器肯定要依附在Android组件上,我们看下最常见的MainActivity在Manifest中的注册:

1
2
3
4
5
6
7
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

在MainActivity中定义了一个Intent过滤器,Intent过滤器由 < intent-filter > 定义,在< intent-filter >中,可以定义以下三种标签:

通过 android : name 属性指定组件能相应的动作。

Action 常量 说明
ANTION_VIEW 最常用的动作,对以Uri传入的数据,根据协议部分以最佳方式启动
ANTION_MAIN 应用程序入口
ANTION_CALL 打开电话应用程序并把Uri的数据部分作为电话号码
ANTION_DIAL 打开电话应用程序并显示Uri的部分数据作为电话号码
ANTION_SEND 启动一个可以发送数据的Activity
ANTION_EDIT 打开一个Activity,对所提供的数据进行编辑操作
ANTION_PICK 从列表中选择某项,并返回所选的数据
ANTION_CHOOSE 显示一个Activity选择器

以上常量对应的值,通常就是 android.intent.action.XXX的类型。

  • < data >

通过一个或多个属性来指定响应的 scheme , host , port , path 和 MIME type 等值。接受的是一个 Uri 对象。

  • < category >

通过android:name属性指定组件能相应的服务方式,每个过滤器可以定义多个< category >标签。为了能够相应隐式启动,必须定义一个CATEGORY_DEFAULT。因为startActivity()和startActivityForResult()方法只有对具有该标签的过滤器进行解析,否则隐式启动永远无法启动对应组件。

Category 常量 说明
CATEGORY_DEFAULT Android系统中默认的执行方式,按照普通的Activity的执行方式执行
CATEGORY_HOME 设置该组件随系统启动而运行
CATEGORY_PREFERENCE 设置该组件为参数面板
CATEGORY_LAUNCHER 设置该组件为当前应用程序启动器中优先级最高的Activity,通常和入口ACTION_MAIN配合使用
CATEGORY_BROWSABLE 设置该组件可以使用浏览器启动
CATEGORY_TAB 设置该组件为TabActivity的
CATEGORY_INFO 用于提供包信息
我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?